package com.wxx.generator;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ArrayUtil;

import java.io.File;
import java.nio.file.CopyOption;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;

/**
 * 静态文件生成器
 */
public class StaticGenerator {

    public static void main(String[] args) {
        String projectPath = System.getProperty("user.dir");//获取项目的根目录
        //输入路径
        String inputPath = projectPath + File.separator + "you-generator-demo-projects" + File.separator + "acm-template";
        //输出路径
        String outputPath = projectPath;
        copyFilesByRecursive(inputPath, outputPath);
    }

    /**
     * 拷贝文件(Hutool实现 会将输入目录完整拷贝到输出目录下)
     *
     * @param inputPath  输入路径
     * @param outputPath 输出路径
     */
    public static void copyFilesByHutool(String inputPath, String outputPath) {
        FileUtil.copy(inputPath, outputPath, true);
    }

    /**
     * 递归拷贝文件（递归实现，会将输入目录完整拷贝到输出目录下）
     *
     * @param inputPath  源路径
     * @param outputPath 目标路径
     */
    public static void copyFilesByRecursive(String inputPath, String outputPath) {
        File inputFile = new File(inputPath);
        File outputFile = new File(outputPath);
        try {
            copyFileByRecursive(inputFile, outputFile);
        } catch (Exception e) {
            System.err.println("文件复制失败");
            e.printStackTrace();
        }
    }

    /**
     * 文件A => 目录B，则文件A放在目录B下
     * 文件A => 文件B，则文件A覆盖文件B
     * 目录A => 目录B，则目录A放在目录B下
     * <p>
     * 核心思想：先创建目录，然后遍历目录内的文件，依次复制
     *
     * @param inputFile  源文件
     * @param outputFile 目标文件
     */
    private static void copyFileByRecursive(File inputFile, File outputFile) throws Exception{
        //区分文件还是目录
        if (inputFile.isDirectory()) {
            System.out.println(inputFile.getName());
            File destOutputFile = new File(outputFile, inputFile.getName());
            //如果是目录 首先创建目标目录
            if (!destOutputFile.exists()) {
                destOutputFile.mkdirs();
            }
            //获取目录下的所有文件和子目录
            File[] files = inputFile.listFiles();
            //无子文件 直接结束
            if (ArrayUtil.isEmpty(files)) {
                return;
            }
            for (File file : files) {
                //递归拷贝下一层文件
                copyFileByRecursive(file, destOutputFile);
            }
        } else {
            //是文件 直接复制到目标目录下
            Path desPath = outputFile.toPath().resolve(inputFile.getName());
            Files.copy(inputFile.toPath(), desPath, StandardCopyOption.REPLACE_EXISTING);
        }
    }


}
